package com.calvin.study.lock.eightlock;

import java.util.concurrent.TimeUnit;

//8锁，就是关于锁的8个问题
//1、标准情况下，两个线程先打印 “发短信” 还是 “打电话”？ 1/发短信 2/打电话
//2、sendSms延迟3s，两个线程先打印“发短信”还是“打电话”？    1/发短信 2/打电话
public class LockTest1 {

	public static void main(String[] args) {
		IPhone phoneTest1 = new Phone();
		test(phoneTest1);
		
		IPhone phoneTest2 = new Phone1();
		//test(phoneTest2);
	}
	
	public static void test(IPhone phone) {
		// 锁的存在
		new Thread(() -> {
			phone.sendSms();
		}, "A").start();

		new Thread(() -> {
			phone.call();
		}, "B").start();
	}

}

interface IPhone{
	
	public void sendSms();
	
	public void call();
}

class Phone implements IPhone {
	
	// synchronized 锁的对象是方法的调用者！
	// 两个方法用的是同一个锁，谁先拿到谁执行！
	public synchronized void sendSms() {
		System.out.println("发短信");
	}

	public synchronized void call() {
		System.out.println("打电话");
	}

}

class Phone1 implements IPhone {
	
	// synchronized 锁的对象是方法的调用者！
	// 两个方法用的是同一个锁，谁先拿到谁执行！
	public synchronized void sendSms() {
		try {
			TimeUnit.SECONDS.sleep(3);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("发短信");
	}

	public synchronized void call() {
		System.out.println("打电话");
	}

}
